﻿using sir_mix_csharp.controladores;
using System;
using System.Windows.Forms;
using sir_mix_csharp.entidades;

namespace sir_mix_csharp
{
    public partial class Form1 : Form
    {

        delegate void InserirLogCallback(string text);
        private ControladoraPrincipal controladoraPrincipal;

        /// <summary>
        /// Construtora da janela, inicia os componentes e recebe alguns parâmetros para serem utilizados nos outros métodos.
        /// </summary>
        /// <param name="controladoraPrincipal">objeto que controla as ações do cliente.</param>
        public Form1(ControladoraPrincipal controladoraPrincipal)
        {
            this.controladoraPrincipal = controladoraPrincipal;
            InitializeComponent();
        }

        /// <summary>
        /// Método que registra no servidor um interesse de venda em uma determinada ação.
        /// </summary>
        /// <param name="sender">Origem do evento</param>
        /// <param name="e">Evento recebido do clique do mouse</param>
        private void button2_Click(object sender, EventArgs e)
        {
            if ((!txtVenderEmpresa.Text.Trim().Equals("")) && (!txtVenderMin.Text.Trim().Equals("")) &&
                (!txtVenderQnt.Text.Trim().Equals("")) && (!txtVenderPrazo.Text.Trim().Equals("")))
            {
                Acao acao = new Acao(txtVenderEmpresa.Text.Trim(), int.Parse(txtVenderQnt.Text.Trim()));
                RegistroInteresse registroVenda = new RegistroInteresse(acao, long.Parse(txtVenderPrazo.Text.Trim()) * 1000, double.Parse(txtVenderMin.Text.Trim()));
                controladoraPrincipal.registrarInteresseVenda(registroVenda);
                string mensagem = String.Format("Registrei interesse de venda de {0} ação(ões) da empresa {1}", registroVenda.getAcao().getQuantidade(), registroVenda.getAcao().getEmpresa());
                inserirLog(mensagem);
                txtVenderEmpresa.Text = "";
                txtVenderMin.Text = "";
                txtVenderQnt.Text = "";
                txtVenderPrazo.Text = "";
            }
        }

        /// <summary>
        /// Método que registra no servidor um interesse de compra em uma determinada ação.
        /// </summary>
        /// <param name="sender">Origem do evento</param>
        /// <param name="e">Evento recebido do clique do mouse</param>
        private void button1_Click(object sender, EventArgs e)
        {
            if ((!txtComprarEmpresa.Text.Trim().Equals("")) && (!txtComprarMax.Text.Trim().Equals("")) && 
                (!txtComprarQnt.Text.Trim().Equals("")) && (!txtComprarPrazo.Text.Trim().Equals("")))
            {
                Acao acao = new Acao(txtComprarEmpresa.Text.Trim(), int.Parse(txtComprarQnt.Text.Trim()));
                RegistroInteresse registroCompra = new RegistroInteresse(acao, long.Parse(txtComprarPrazo.Text.Trim()) * 1000, double.Parse(txtComprarMax.Text.Trim()));
                controladoraPrincipal.registrarInteresseCompra(registroCompra);
                string mensagem = String.Format("Registrei interesse de compra de {0} ação(ões) da empresa {1}", registroCompra.getAcao().getQuantidade(), registroCompra.getAcao().getEmpresa());
                inserirLog(mensagem);
                txtComprarEmpresa.Text = "";
                txtComprarMax.Text = "";
                txtComprarQnt.Text = "";
                txtComprarPrazo.Text = "";
            }
        }

        /// <summary>
        /// Método que exibe as ações que o cliente possui.
        /// </summary>
        /// <param name="sender">Origem do evento</param>
        /// <param name="e">Evento recebido do clique do mouse</param>
        private void button3_Click(object sender, EventArgs e)
        {
            controladoraPrincipal.listarAcoes();
        }

        /// <summary>
        /// Método que exibe para o cliente os interesses de venda que estão registrados no servidor.
        /// </summary>
        /// <param name="sender">Origem do evento</param>
        /// <param name="e">Evento recebido do clique do mouse</param>
        private void button4_Click(object sender, EventArgs e)
        {
            controladoraPrincipal.listarVendasServidor();
        }

        /// <summary>
        /// Insere um texto na janela de log.
        /// </summary>
        /// <param name="log">Texto a ser inserido</param>
        public void inserirLog(String log){
            txtLog.Invoke(new MethodInvoker(delegate { txtLog.Text = txtLog.Text + System.Environment.NewLine + log; }));
        }

    }

}
